#pragma once 

#include <unordered_map>
#include <stdexcept> 
#include "vertex.h"


/* 基于邻接表实现的无向图类 */
class GraphAdjList 
{
  public:
    /* 构造方法 */
    GraphAdjList(const std::vector<std::vector<Vertex*>>& edges);   
    /* 在 vector 中删除指定节点 */
    void remove(std::vector<Vertex*>& vec, Vertex* vet);
    /* 获取顶点数量 */
    int size();   
    /* 添加边 */
    void addEdge(Vertex* vet1, Vertex* vet2);
    /* 删除边 */
    void removeEdge(Vertex* vet1, Vertex* vet2);
    /* 添加顶点 */
    void addVertex(Vertex* vet);
    /* 删除顶点 */
    void removeVertex(Vertex* vet);
    /* 打印邻接表 */
    void print();
    
    // 邻接表，key：顶点，value：该顶点的所有邻接顶点
    std::unordered_map<Vertex*, std::vector<Vertex*>> adjList;
};
